<?php
class Arm_Db_Dump_Plugin_Mysql
{
    /**
     * 
     * @var array
     */
    private $_searsh = array();
    
    /**
     * 
     * @var array
     */
    private $_replace = array();
    
    /**
     * Путь к mysqldump
     * @var path
     */
    private $_dump;
    
    /**
     * Путь к mysql
     * @var path
     */
    private $_import;
    
    /**
     * Конект с базой данных
     * @var Zend_Db_Adapter_Abstract
     */
    private $_db;
    
    /**
     * Базовая команда - аунтфикация для сервера mysql
     * @var string
     */
    private $_baseComand = ' -h {host} -P {port} -u {username} -p{password} ';
    
    
    
    public function __construct(Zend_Db_Adapter_Abstract  $db)
    {
        $config = $db->getConfig();
        foreach ($config as $k=>$v) {
            if(is_array($v)) {
                continue;
            }
            $this->_searsh[] = '{'.$k.'}';
            $this->_replace[] = $v;
        }
        $this->_db = $db;
        $this->_dump   = Arm_Core::getConfigApplication()->db->dump;
        $this->_import = Arm_Core::getConfigApplication()->db->import;
    }
    
    /**
     * Записываем дамп целой базы данных.
     * 
     * @param path $file путь к файлу в который будет записан damp  
     */
    public function exportDatabase($file)
    {
        $comand = $this->_dump . $this->_baseComand . '--add-drop-table {dbname} > ' . $file;
        return $this->_runComand($comand, $file);
    }
    
    /**
     * Записывает дамп таблиц модуля
     * 
     * @param string $module
     * @param string $file
     * @return null  или результат выполнения команды
     */
    public function exportTablesModule($module, $file)
    {
        $tables = $this->_db->listTables();
        $t = array();
        foreach($tables as $v) {
            if(strpos($v, $module . '_') === 0) {
                $t[] = $v;
            }
        }
        // нет таблиц
        if($t === array()) {
            return null;
        }
        $comand = $this->_dump . $this->_baseComand . '--default-character-set={charset} --add-drop-table {dbname} ' . implode(' ', $t) .' > ' . $file;
        return $this->_runComand($comand, $file);
    }
    
    /**
     * Импортирования файла sql в базу.
     * @param path $pathFile
     */
    public function import($pathFile)
    {
          $comand = $this->_import . $this->_baseComand . ' {dbname}  --default-character-set={charset} -s  < ' . $pathFile;
          return $this->_runComand($comand, $pathFile);
    }
    
    /**
     * Выполнения команды.
     * 
     * @param string $comand
     * @return string
     */
    protected function _runComand($comand, $file)
    {
        $comand = str_replace($this->_searsh, $this->_replace, $comand);
        $result = null;
        system($comand, $result);
        if(0  !== (int)$result) {
            throw new Arm_Db_Exception(Arm_Translate::_('Не удалось выполнить команду "%s"', $comand));
        }
        
        return true;
        
    }
}